"""
    霍夫圆检测
        cv.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0)
            参数：
                image:输入图像，应输入灰度图像
                method:使用霍夫变换圆检测的算法，它的参数是CV.HOUGH_GRADIENT
                dp:霍夫空间的分辨率，dp=1表示霍夫空间与输入图像空间的大小一致，dp=2时霍夫空间是输入图像空间的一半，以此类推
                minDist:为圆心之间的最小距离，如果检测到两个圆心之间的距离小于该值，则认为它们是同一个圆心
                param1:边缘检测时使用Canny算子的高阈值，低阈值是高阈值的一半。
                param2:检测圆心和确定半径时所共有的阈值
                minRadius和maxRadius为所检测到的圆半径的最小值和最大值
"""
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1. 读取图像,转为二值图
planets = cv.imread("image/star.jpeg")
gay_img = cv.cvtColor(planets, cv.COLOR_BGRA2GRAY)

# 2. 进行中值模糊，去噪点
img = cv.medianBlur(gay_img, 7)

# 3. 霍夫圆检测
circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 200, param1=100, param2=30, minRadius=0, maxRadius=100)
print(circles)

# 4. 将检测结果绘制在图像上
for circle in circles[0, :]:  # 遍历矩阵每一行数据
    # 坐标没有小数，转换为整形
    x, y, radius = circle
    center = (int(x), int(y))
    # 绘制图像
    cv.circle(planets, center, int(radius), (0, 255, 0), 2)
    # 绘制圆心
    cv.circle(planets, center, 2, (0, 255, 0), -1)

# 5. 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(planets[:, :, ::-1]), plt.title("霍夫变换圆检测")
plt.xticks([]), plt.yticks([])
plt.show()
